package com.shujia.wyh.java_moni_hadoop;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

/**
 * 前提：假设每一行数据是1M大小,文件大小是100M,将来会产生8个block块
 */
public class SplitFileToBlocks {
    public static void main(String[] args) throws Exception {
        //1、将文件读取进来
        //使用IO流，因为students.txt是一个文本文件，所以使用字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("bigdata23-hadoop/data/students.txt"));
        //定义一个序号，表示往哪个文件写（这里的文件其实模拟的就是一个一个的block块）
        int index = 0;
        //创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("bigdata23-hadoop/data/blocks/block-" + index));

        //定义一个变量记录行数
        int rowNumber = 0;
        //使用ArrayList集合存储已经读取到的数据，因为List相关集合具有索引的概念，方便统计读行数的变化
        ArrayList<String> list = new ArrayList<>();

        //定义一个变量表示每次开始写入的位置
        int startIndex = 0;

        //开始编写生成block块的逻辑代码
        //为了模拟1.1的溢出，大概是140M的时候，开始生成一个block块
        String line = null;
        while ((line = br.readLine()) != null) {
            //读到了一行，行数+1
            rowNumber++;
            //将读取到数据写到集合中
            list.add(line);
            //当读取到140条数据的时候写到block文件中
            if (rowNumber == 140) {
                startIndex = 128 * index;
                for (int i = startIndex; i <= startIndex + 127; i++) {
                    bw.write(list.get(i));
                    bw.newLine();
                    bw.flush();
                }
                rowNumber = 12;
                index++;
                bw = new BufferedWriter(new FileWriter("bigdata23-hadoop/data/blocks/block-" + index));
            }
        }

        //将剩下的数据也写到一个block文件中
        for (int i = list.size() - rowNumber; i < list.size(); i++) {
            bw.write(list.get(i));
            bw.newLine();
            bw.flush();
        }


        //释放资源
        bw.close();
        br.close();
    }
}
